package com.hope.reflection.question;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionUtils {
    public static void main(String[] args) {

    }

    @Test
    public void api_02() throws Exception {
//      第二组:java.lang.reflect t.Field类
//      1. getModifiers: 以int形式返回修饰符值
//      [说明: 默认修饰符 是0 ， public 是1，private是2，protected是4，static是8，final是16]，
//      所以  public(1) + static (8) = 9
//      2. getType:以Class形式返回类类型
//      3. getName:返回属性名

        Class<?> personcls = Class.forName("com.hope.reflection.question.Person");
//        getDeclaredFields:获取本类中所有属性
        Field[] declaredFields = personcls.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("本类中所有属性" + declaredField.getName()
                    +" 该属性的修饰符值"+declaredField.getModifiers()
            +" 该属性的类型="+declaredField.getType());
        }


        //6.getDeclaredMethods:获取本类中所有方法
        Method[] declaredMethods = personcls.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("获取本类中所有方法" + declaredMethod.getName()
                    +" 该方法的修饰符值"+declaredMethod.getModifiers()
            +" 该方法的返回类型"+declaredMethod.getReturnType());
        }

    }



    //第一组方法API
    @Test
    public void api_01() throws Exception {
//        得到Class对象
        Class<?> personcls = Class.forName("com.hope.reflection.question.Person");

//        1. getName:获取全类名
        System.out.println(personcls.getName());//com.hope.reflection.question.Person
//        2. getSimpleName:获取简单类名
        System.out.println(personcls.getSimpleName());//Person
//        3.getFields:获取所有public修饰的属性，包含本类以及父类的
        Field[] fields = personcls.getFields();
        for (Field field : fields) {
            System.out.println("本类以及父类的的属性" + field.getName());//本类以及父类的的属性name 本类以及父类的的属性hobby
        }

//        4. getDeclaredFields:获取本类中所有属性
        Field[] declaredFields = personcls.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("本类中所有属性" + declaredField.getName());//name    age     job     sal
        }
//        5.getMethods:获取所有public修饰的方法，包含本类以及父类的
        Method[] methods = personcls.getMethods();
        for (Method method : methods) {
            System.out.println("本类以及父类的方法" + method.getName());
        }
//        6.getDeclaredMethods:获取本类中所有方法
        Method[] declaredMethods = personcls.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("获取本类中所有方法" + declaredMethod.getName());
        }
//        7. getConstructors:获取本类所有public修饰的构造器
        Constructor<?>[] constructors = personcls.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println("本类public的构造器" + constructor.getName());
        }
//        8. getDeclaredConstructors:获取本类中所有构造器
        Constructor<?>[] declaredConstructors = personcls.getDeclaredConstructors();
        for (Constructor<?> constructor : declaredConstructors) {
            System.out.println("获取本类中所有构造器" + constructor.getName());
        }
//        9. getPackage:以Package形式返回包信息
        System.out.println("Package形式返回包信息" + personcls.getPackage());
//        10.getSuperClass:以Class形式返回父类信息
        System.out.println("父类的class对象" + personcls.getSuperclass());
//        11.getlnterfaces:以Class[形式返回接口信息
        Class<?>[] interfaces = personcls.getInterfaces();
        for (Class<?> anInterface : interfaces) {
            System.out.println("接口信息=" + anInterface);
        }
//        12.getAnnotations:以Annotation形式返回注解信息
        Annotation[] annotations = personcls.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println("注解信息"+annotation);
        }

    }

}

class A {
    public String hobby;

    public void hi() {

    }

    public A() {
    }
}

interface IA {

}

interface IB {

}



@Deprecated
class Person extends A implements IA,IB{
    //属性
    public String name;
    protected int age;
    String job;
    private double sal;

    //构造器
    public Person() {

    }

    public Person(String name) {

    }

    private Person(String name, int age) {

    }

    //方法
    public void m1() {

    }

    protected void m2() {

    }

    private void m3() {

    }

    void m4() {

    }


}